package com.ysjy.course.config;

import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.Collections;
import java.util.List;

/**
 * @author: lbh
 * @date: 2018/11/27 14:23
 * @description: springsecurity 跨域设置
 * extends WebMvcConfigurerAdapter已过时。
 *  implements WebMvcConfigurer接口才是最新的
 */
@Configuration
//@AutoConfigureBefore(SpringSecurityConf.class)
@Slf4j
//public class CrosConfig extends WebMvcConfigurationSupport {
public class CrosConfig implements WebMvcConfigurer{
        //, WebBindingInitializer {
    //public class CrosConfig extends WebMvcConfigurerAdapter {


    /*CrosConfig配置类实现了implements WebMvcConfigurer父类并且重写了addCorsMappings方法，配置信息
    1、addMapping：
    配置可以被跨域的路径，可以任意配置，可以具体到直接请求路径。
    2、allowedMethods：
    允许所有的请求方法访问该跨域资源服务器，
    如：POST、GET、PUT、DELETE等。
    3、allowedOrigins：允许所有的请求域名访问我们的跨域资源，可以固定单条或者多条内容，如："http://www.baidu.com"，
    只有百度可以访问我们的跨域资源。
    4、allowedHeaders：允许所有的请求header访问，可以自定义设置任意请求头信息，如："X-YAUTH-TOKEN"*/

        @Override
        public void addCorsMappings(CorsRegistry registry){
            log.info("====1======springboot项目的全局CORS配置，解决前后端分离跨域问题=====1====");
            registry.addMapping("/**")
                    //只允许指定域名进行访问，否则会报Invalid CORS request或者403 Forbidden
                    //.allowedOrigins("http://www.baidu.com")
                    .allowedOrigins("*")
                    .allowedMethods("*")
                    .allowedHeaders("*")
                    .allowCredentials(true)
                    .maxAge(3600);
        }


        /**
         允许任何域名使用
         允许任何头
         允许任何方法（post、get等）
         */
      /*  @Bean
        public CorsFilter corsFilter() {
          UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
            CorsConfiguration corsConfiguration = new CorsConfiguration();
            // addAllowedOrigin 不能设置为* 因为与 allowCredentials 冲突
            corsConfiguration.addAllowedOrigin("*");
            corsConfiguration.addAllowedHeader("*");
            corsConfiguration.addAllowedMethod("*");
            // allowCredentials 需设置为true
            corsConfiguration.setAllowCredentials(true);
            source.registerCorsConfiguration("/**", corsConfiguration);
         return new CorsFilter(source);
       }*/



    @Bean
    public FilterRegistrationBean simpleCorsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);
        // *** URL below needs to match the Vue client URL and port ***
        //config.setAllowedOrigins(Collections.singletonList("http://localhost:9999"));
        //config.setAllowedOrigins(Collections.singletonList("http://mps.mipsyun.com"));
        //本地调试接口时将setAllowedOrigins设置为*,否则会报Invalid CORS request或者403 Forbidden
        // todo 直接连接服务器，便于前端调试，正式上线删除
        List<String> ipList= Lists.newArrayList();
        ipList.add("http://127.0.0.1:9022");
        ipList.add("*");
        config.setAllowedOrigins(ipList);

//        config.setAllowedOrigins(ipList);
        //config.setAllowedOrigins(Collections.singletonList("*"));
        //config.setAllowedOrigins(Collections.singletonList("http://139.159.179.89:9500"));

   /*     config.setAllowedOrigins(Collections.singletonList("http://wxmp.mipsyun.com/login"));

        List<String> list= Lists.newArrayList();
        list.add("http://localhost:9999");
        list.add("http://mps.mipsyun.com:9999");
        list.add("http://wxmp.mipsyun.com/login");
        config.setAllowedOrigins(Collections.singletonList(list.toString()));*/


        config.setAllowedMethods(Collections.singletonList("*"));
        config.setAllowedHeaders(Collections.singletonList("*"));
        source.registerCorsConfiguration("/**", config);
        FilterRegistrationBean bean = new FilterRegistrationBean<>(new CorsFilter(source));
        bean.setOrder(Ordered.HIGHEST_PRECEDENCE);
        return bean;
    }

}
